package com.jinzhi.jzweb.controller;


import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

import com.jinzhi.common.utils.ApiResult;
import com.jinzhi.jzweb.domain.*;
import com.jinzhi.jzweb.domain.vo.ZykResourcesChaptersVO;
import com.jinzhi.jzweb.service.*;
import com.jinzhi.sys.domain.UserDO;
import com.jinzhi.sys.service.UserService;
import javassist.expr.NewExpr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.jinzhi.common.annotation.Log;
import com.jinzhi.common.base.BaseController;
import com.jinzhi.common.utils.Result;

/**
 * 
 * <pre>
 * 资源章节表
 * </pre>
 * <small> 2023-12-07 10:56:14 | lance</small>
 */
@Controller
@RequestMapping("/jzweb/zykResourcesChapters")
public class ZykResourcesChaptersController extends BaseController {
	@Autowired
	private ZykResourcesChaptersService zykResourcesChaptersService;

	@Autowired
	private ZykManagementResourcesService zykManagementResourcesService;
	@Autowired
	private ZykResourcesService zykResourcesService; //资源表

	@Autowired
	private UserService userService;

	@Autowired
	private ZykResourcesUserService zykResourcesUserService;

	@Autowired
	private JazSysProjectService jazSysProjectService;

	@GetMapping()
	String ZykResourcesChapters(){
	    return "jzweb/zykResourcesChapters/zykResourcesChapters";
	}
	
	@ResponseBody
	@GetMapping("/list")
	public Result<Page<ZykResourcesChaptersDO>> list(ZykResourcesChaptersDO zykResourcesChaptersDTO){

		// 查询列表数据
		EntityWrapper<ZykResourcesChaptersDO> wrapper =new EntityWrapper();
		if (zykResourcesChaptersDTO.getName()!=null&&!zykResourcesChaptersDTO.getName().equals("")) {
			wrapper.like("name", "%" + zykResourcesChaptersDTO.getName() + "%");
		}
		if (zykResourcesChaptersDTO.getParenId()!=null&&!zykResourcesChaptersDTO.getParenId().equals("")) {
			wrapper.eq("paren_id", zykResourcesChaptersDTO.getParenId()); //父级id
		}
		if (zykResourcesChaptersDTO.getLevel()!=null&&!zykResourcesChaptersDTO.getLevel().equals("")) {
			wrapper.eq("level", zykResourcesChaptersDTO.getLevel()); //层级
		}
//		wrapper.orderBy("sort", false);
		wrapper.orderBy("creater_date", false);
		Page<ZykResourcesChaptersDO> page = zykResourcesChaptersService.selectPage(getPage(ZykResourcesChaptersDO.class), wrapper);
		List list = new ArrayList();
		for (int i = 0; i < page.getRecords().size(); i++) {

			ZykResourcesChaptersDO obj = (ZykResourcesChaptersDO) page.getRecords().get(i);
			//查询该章节是否有下级
			EntityWrapper<ZykResourcesChaptersDO> recordsWrapper = new EntityWrapper<>();
			recordsWrapper.eq("paren_id",obj.getId()); //该章节id
			List<ZykResourcesChaptersDO> list2 = zykResourcesChaptersService.selectList(recordsWrapper);
			if (list2!=null&&list2.size()>0){
				obj.setIssLevel(true);
			}else {
				obj.setIssLevel(false);
			}

			//查询该章节是否有资源
			EntityWrapper<ZykResourcesDO> zykResourcesWrapper = new EntityWrapper<>();
			zykResourcesWrapper.eq("chapters_id",obj.getId()); //该章节id
			List<ZykResourcesDO> list1 = zykResourcesService.selectList(zykResourcesWrapper);
			if (list1!=null&&list1.size()>0){
				obj.setResources(list1);
			}else {
				obj.setResources(null);
			}
			list.add(obj);
		}
		page.setRecords(list);
        return Result.ok(page);
	}
	
	@GetMapping("/add")
	String add(){
	    return "jzweb/zykResourcesChapters/add";
	}

	@GetMapping("/add2")
	String add2(){
		return "jzweb/zykResourcesChapters/chartert";
	}

	@GetMapping("/add3")
	String add3(){
		return "jzweb/zykResourcesChapters/chartertList";
	}


	@GetMapping("/edit")
	String edit(Long id,Model model){
		ZykResourcesChaptersDO zykResourcesChapters = zykResourcesChaptersService.selectById(id);
		EntityWrapper<ZykResourcesDO> zykResourcesWrapper = new EntityWrapper<>();
		zykResourcesWrapper.eq("chapters_id",zykResourcesChapters.getId()); //该章节id
		List<ZykResourcesDO> list1 = zykResourcesService.selectList(zykResourcesWrapper);
		if (list1!=null&&list1.size()>0){
			zykResourcesChapters.setResources(list1);
		}else {
			zykResourcesChapters.setResources(null);
		}
		String sp ="";
		String spmc ="";
		String sppx ="";
		String wd ="";
		String tp ="";
		for (int i=0;i<list1.size();i++){
			if (list1.get(i).getType() == 1){ //视频
				sp = sp+list1.get(i).getFileUrl()+",";//路径
				spmc = spmc+list1.get(i).getZyName()+",";//名称
				sppx = sppx+list1.get(i).getZySort()+",";//排序
			}
			if (list1.get(i).getType() == 2){ //文档
				wd = wd+list1.get(i).getFileUrl()+",";//路径
			}
			if (list1.get(i).getType() == 3){ //图片
				tp = tp+list1.get(i).getFileUrl()+",";//路径
			}
		}

		zykResourcesChapters.setSpUrls(removeLastComma(sp));
		zykResourcesChapters.setZyNames(removeLastComma(spmc));
		zykResourcesChapters.setZySorts(removeLastComma(sppx));
		zykResourcesChapters.setWdUrls(removeLastComma(wd));
		zykResourcesChapters.setTpUrls(removeLastComma(tp));
		model.addAttribute("zykResourcesChapters", zykResourcesChapters);
	    return "jzweb/zykResourcesChapters/edit";
	}

	private static String removeLastComma(String originalString) {
		int lastIndex = originalString.lastIndexOf(",");
		if (lastIndex >= 0) {
			return originalString.substring(0, lastIndex) + originalString.substring(lastIndex + 1);
		}
		return originalString;
	}
	
	@Log("添加资源章节表")
	@ResponseBody
	@PostMapping("/save")
	@Transactional
	public Result<String> save( ZykResourcesChaptersVO zykResourcesChaptersVO) throws UnsupportedEncodingException {

		if (!zykResourcesChaptersVO.getSpUrls().equals("")&&!zykResourcesChaptersVO.getZyNames().equals("")&&zykResourcesChaptersVO.getZySorts().equals("")){
			return Result.fail("请输入序号");
		}

		ZykResourcesChaptersDO zykResourcesChaptersDO =new ZykResourcesChaptersDO();
		zykResourcesChaptersDO.setLevel(zykResourcesChaptersVO.getLevel()); //层级
		zykResourcesChaptersDO.setParenId(zykResourcesChaptersVO.getParenId()); //父级id
		zykResourcesChaptersDO.setSort(zykResourcesChaptersVO.getSort()); //排序

		String decodedValue = java.net.URLDecoder.decode(zykResourcesChaptersVO.getName(), "UTF-8");
		zykResourcesChaptersDO.setName(decodedValue); //资源名
		zykResourcesChaptersDO.setManagementResourcesId(zykResourcesChaptersVO.getManagementResourcesId()); //资源顶级id
		zykResourcesChaptersDO.setCreaterDate(new Date());
		zykResourcesChaptersDO.setCreaterName(this.getUsername());

		zykResourcesChaptersService.insert(zykResourcesChaptersDO);
		Long id = zykResourcesChaptersDO.getId();

		//视频
		if (zykResourcesChaptersVO.getSpUrls()!=null&&!zykResourcesChaptersVO.getSpUrls().equals("")){
			List<String> listSp = splitStrArrayList(zykResourcesChaptersVO.getSpUrls());
			List<String> spNames = splitStrArrayList(zykResourcesChaptersVO.getZyNames());
			List<String> spSorts = splitStrArrayList(zykResourcesChaptersVO.getZySorts());
			for (int i=0;i<listSp.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(id));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listSp.get(i));
				zykResourcesDO.setType(1);
				zykResourcesDO.setZyName(spNames.get(i));
				zykResourcesDO.setZySort(spSorts.get(i));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setCreaterName(this.getUsername());
				zykResourcesService.insert(zykResourcesDO);
			}
		}

		//文档
		if (zykResourcesChaptersVO.getWdUrls()!=null&&!zykResourcesChaptersVO.getWdUrls().equals("")){
			List<String> listWd = splitStrArrayList(zykResourcesChaptersVO.getWdUrls());
			for (int i=0;i<listWd.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(id));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listWd.get(i));
				zykResourcesDO.setType(2);
				zykResourcesService.insert(zykResourcesDO);
			}
		}

		//图片
		if (zykResourcesChaptersVO.getTpUrls()!=null&&!zykResourcesChaptersVO.getTpUrls().equals("")){
			List<String> listTp = splitStrArrayList(zykResourcesChaptersVO.getTpUrls());
			for (int i=0;i<listTp.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(id));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listTp.get(i));
				zykResourcesDO.setType(3);
				zykResourcesService.insert(zykResourcesDO);
			}
		}
        return Result.ok();
	}


	private static String bs = ",";

	private static List<String> splitStrArrayList(String str) {
		List<String> stringList = new ArrayList<>();
		if (str != null) {
			String[] strs = str.split(bs);
			stringList.addAll(Arrays.asList(strs));
			return stringList;
		}
		return null;
	}

	
	@Log("修改资源章节表")
	@ResponseBody
	@RequestMapping("/update")
	@Transactional
	public Result<String>  update( ZykResourcesChaptersVO zykResourcesChaptersVO) throws UnsupportedEncodingException {
		ZykResourcesChaptersDO zykResourcesChaptersDO = zykResourcesChaptersService.selectById(zykResourcesChaptersVO.getId());
		zykResourcesChaptersDO.setParenId(zykResourcesChaptersVO.getParenId());
		zykResourcesChaptersDO.setManagementResourcesId(zykResourcesChaptersVO.getManagementResourcesId());
		if (zykResourcesChaptersVO.getLevel() != zykResourcesChaptersDO.getLevel()){  //层级
			zykResourcesChaptersDO.setLevel(zykResourcesChaptersVO.getLevel());
		}
		if (zykResourcesChaptersVO.getName() != zykResourcesChaptersDO.getName()){  //标题
			String decodedValue = java.net.URLDecoder.decode(zykResourcesChaptersVO.getName(), "UTF-8");
			zykResourcesChaptersDO.setName(decodedValue); //资源名
		}
		if (zykResourcesChaptersVO.getSort() != zykResourcesChaptersDO.getSort()){  //标题
			zykResourcesChaptersDO.setSort(zykResourcesChaptersVO.getSort());
		}

		//删除该章节的资源
		EntityWrapper wrapper =new EntityWrapper();
		wrapper.eq("chapters_id",zykResourcesChaptersDO.getId());
		zykResourcesService.delete(wrapper);

		//视频
		if (zykResourcesChaptersVO.getSpUrls()!=null&&!zykResourcesChaptersVO.getSpUrls().equals("")){
			List<String> listSp = splitStrArrayList(zykResourcesChaptersVO.getSpUrls());
			List<String> spNames = splitStrArrayList(zykResourcesChaptersVO.getZyNames());
			List<String> spSorts = splitStrArrayList(zykResourcesChaptersVO.getZySorts());
			for (int i=0;i<listSp.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(zykResourcesChaptersDO.getId()));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listSp.get(i));
				zykResourcesDO.setType(1);
				zykResourcesDO.setZyName(spNames.get(i));
				zykResourcesDO.setZySort(spSorts.get(i));
				zykResourcesService.insert(zykResourcesDO);
			}
		}

		//文档
		if (zykResourcesChaptersVO.getWdUrls()!=null&&!zykResourcesChaptersVO.getWdUrls().equals("")){
			List<String> listWd = splitStrArrayList(zykResourcesChaptersVO.getWdUrls());
			for (int i=0;i<listWd.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(zykResourcesChaptersDO.getId()));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listWd.get(i));
				zykResourcesDO.setType(2);
				zykResourcesService.insert(zykResourcesDO);
			}
		}

		//图片
		if (zykResourcesChaptersVO.getTpUrls()!=null&&!zykResourcesChaptersVO.getTpUrls().equals("")){
			List<String> listTp = splitStrArrayList(zykResourcesChaptersVO.getTpUrls());
			for (int i=0;i<listTp.size();i++){
				ZykResourcesDO zykResourcesDO =new ZykResourcesDO();
				zykResourcesDO.setChaptersId(String.valueOf(zykResourcesChaptersDO.getId()));
				zykResourcesDO.setCreaterDate(new Date());
				zykResourcesDO.setFileUrl(listTp.get(i));
				zykResourcesDO.setType(3);
				zykResourcesService.insert(zykResourcesDO);
			}
		}
		zykResourcesChaptersDO.setUpdateName(this.getUsername());
		zykResourcesChaptersDO.setUpdateDate(new Date());
		boolean update = zykResourcesChaptersService.updateById(zykResourcesChaptersDO);
		return update ? Result.ok() : Result.fail();
	}
	
	@Log("删除资源章节表")
	@PostMapping( "/remove")
	@ResponseBody
	public Result<String>  remove( Long id){
		zykResourcesChaptersService.deleteById(id);
        return Result.ok();
	}
	
	@Log("批量删除资源章节表")
	@PostMapping( "/batchRemove")
	@ResponseBody
	public Result<String>  remove(@RequestParam("ids[]") Long[] ids){
		zykResourcesChaptersService.deleteBatchIds(Arrays.asList(ids));
		return Result.ok();
	}


	/**
	 * 资源章节目录一级二级菜单查询
	 * @return
	 */
	@GetMapping("/selChapters")
	public ApiResult<List<ZykResourcesChaptersDO>>selChapters(String parenId, String level){
		EntityWrapper<ZykResourcesChaptersDO> wrapper = new EntityWrapper<>();
		wrapper.eq("paren_id",parenId); //父级id
		wrapper.eq("level",level); //层级
		wrapper.orderBy(true,"sort");
		wrapper.orderBy("creater_date", false);
		// 创建分页对象，指定当前页数和每页显示的记录数

		// 调用分页查询方法，将查询结果赋值给分页对象
		List<ZykResourcesChaptersDO> zykResourcesChaptersDOs = zykResourcesChaptersService.selectList(wrapper);
		for (int i=0;i<zykResourcesChaptersDOs.size();i++){
			//查询该章节是否有下级
			EntityWrapper<ZykResourcesChaptersDO> recordsWrapper = new EntityWrapper<>();
			recordsWrapper.eq("paren_id",zykResourcesChaptersDOs.get(i).getId()); //该章节id
			List<ZykResourcesChaptersDO> list = zykResourcesChaptersService.selectList(recordsWrapper);
			if (list!=null&&list.size()>0){
				zykResourcesChaptersDOs.get(i).setIssLevel(true);
			}else {
				zykResourcesChaptersDOs.get(i).setIssLevel(false);
			}

			//查询该章节是否有资源
			EntityWrapper<ZykResourcesDO> zykResourcesWrapper = new EntityWrapper<>();
			zykResourcesWrapper.eq("chapters_id",zykResourcesChaptersDOs.get(i).getId()); //该章节id
			List<ZykResourcesDO> list1 = zykResourcesService.selectList(zykResourcesWrapper);
			if (list1!=null&&list1.size()>0){
				zykResourcesChaptersDOs.get(i).setResources(list1);
			}else {
				zykResourcesChaptersDOs.get(i).setResources(null);
			}
		}
		return ApiResult.success(zykResourcesChaptersDOs);
	}






	@GetMapping("/accessConfiguration")
	String accessConfiguration(Model model,Long id) {
		//查询课程资源
		List<ZykManagementResourcesDO> zykManagementResourcesDOS = zykManagementResourcesService.selectList(null);
		//查询用户所拥有的课程资源
		EntityWrapper<ZykResourcesUserDO> wrapper =new EntityWrapper<>();
		wrapper.eq("user_id",id);
		List<ZykResourcesUserDO> byUserAll = zykResourcesUserService.selectList(wrapper);
		//表示没有任何资源，直接返回列表
		if (byUserAll.size()<1){
			// 根据projectId分成多个集合
			Map<String, List<ZykManagementResourcesDO>> groupedMap = new HashMap<>();
			for (ZykManagementResourcesDO resource : zykManagementResourcesDOS) {
				String projectId = resource.getProjectId();
				if (!groupedMap.containsKey(projectId)) {
					groupedMap.put(projectId, new ArrayList<>());
				}
				groupedMap.get(projectId).add(resource);
			}

			Map<String, List<ZykManagementResourcesDO>> modifiedMap = new HashMap<>();
			for (Map.Entry<String, List<ZykManagementResourcesDO>> entry : groupedMap.entrySet()) {
				String oldValue = entry.getKey();
				JazSysProjectDO jazSysProjectDO = jazSysProjectService.selectById(oldValue);
				String newValue = jazSysProjectDO.getName();
				List<ZykManagementResourcesDO> value = entry.getValue();
				modifiedMap.put(newValue, value);
			}
			model.addAttribute("coursesAll",modifiedMap);
			return "jzweb/zykResourcesChapters/zykAccessConfiguration";
		}
		//表示有资源需要显示它有哪些资源
		for (int i=0;i<byUserAll.size();i++){
			for (int j=0;j<zykManagementResourcesDOS.size();j++){
				//如果課程id相同
				if (zykManagementResourcesDOS.get(j).getId().equals(byUserAll.get(i).getManagementId())) {
					zykManagementResourcesDOS.get(j).setIsShow("1");
				}
			}
		}

		// 根据projectId分成多个集合
		Map<String, List<ZykManagementResourcesDO>> groupedMap = new HashMap<>();
		for (ZykManagementResourcesDO resource : zykManagementResourcesDOS) {
			String projectId = resource.getProjectId();
			if (!groupedMap.containsKey(projectId)) {
				groupedMap.put(projectId, new ArrayList<>());
			}
			groupedMap.get(projectId).add(resource);
		}

		Map<String, List<ZykManagementResourcesDO>> modifiedMap = new HashMap<>();
		for (Map.Entry<String, List<ZykManagementResourcesDO>> entry : groupedMap.entrySet()) {
			String oldValue = entry.getKey();
			JazSysProjectDO jazSysProjectDO = jazSysProjectService.selectById(oldValue);
			String newValue = jazSysProjectDO.getName();
			List<ZykManagementResourcesDO> value = entry.getValue();
			modifiedMap.put(newValue, value);
		}
		EntityWrapper<ZykResourcesUserDO> wrapperzyk =new EntityWrapper();
		wrapperzyk.eq("user_id",id);
		Date entDate = zykResourcesUserService.selectList(wrapperzyk).get(0).getEntDate();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		String formattedDate = dateFormat.format(entDate);
		model.addAttribute("entDate",formattedDate);
		model.addAttribute("coursesAll",modifiedMap);
		return "jzweb/zykResourcesChapters/zykAccessConfiguration";
	}






	@PostMapping( "/saveAccessConfiguration")
	@Transactional
	@ResponseBody
	public Result<String> saveAccessConfiguration(Long userId,Date entDate,@RequestParam("ids[]") Long[] ids){
		EntityWrapper wrapper =new EntityWrapper();
		wrapper.eq("user_id",userId);
		List<ZykResourcesUserDO> list = zykResourcesUserService.selectList(wrapper);
		if (list.size()>0) {
			List<Long> idList = list.stream().map(ZykResourcesUserDO::getId).collect(Collectors.toList()); // 将id收集到新的集合中
			zykResourcesUserService.deleteBatchIds(idList);  //删除原有数据
		}
		List<ZykResourcesUserDO> insertZykResourcesUserDO =new ArrayList<>();
		for (int i=0;i<ids.length;i++){
			ZykResourcesUserDO zykResourcesUserDO = new ZykResourcesUserDO();
			zykResourcesUserDO.setUserId(userId);
			zykResourcesUserDO.setManagementId(ids[i]);
			zykResourcesUserDO.setEntDate(entDate);
			insertZykResourcesUserDO.add(zykResourcesUserDO);
		}
		zykResourcesUserService.insertBatch(insertZykResourcesUserDO);
		return Result.ok();
	}

}
